#include <mqueue.h>
#include <pthread.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>

static char *mq_name = "/mq_test"; // 队列文件的路径， /代表队列文件所在的目录 /dev/mqueue
static mqd_t mqd; // 消息队列的描述符   description

// 线程1函数
void *first_thread_fun(void *arg) {
    printf("first线程开始执行 \n");

    

    // 发送消息
    char *data = "abcd";
    mq_send(mqd, data, strlen(data)+1, 0);

    return NULL;
}

// 线程2函数
void *second_thread_fun(void *arg) {
    printf("second线程开始执行 \n");

    sleep(1);

    // 接收消息
    char data_buf[100];
    ssize_t len = mq_receive(mqd, data_buf, 100, NULL);  // 长度不能小于最大长度
    printf("接收到消息：%s, len=%ld \n", data_buf, len);

    return NULL;
}

int main(int argc, char const *argv[])
{
    printf("main线程开始执行 \n");

    // 创建消息队列
    struct mq_attr attr;
    attr.mq_msgsize = 100; // 消息的最大字节数
    attr.mq_maxmsg = 10; // 消息队列中最大消息数
    mqd = mq_open(mq_name, O_CREAT|O_RDWR, 0644, &attr);
    if (mqd == -1) {
        printf("打开消息队列失败 \n");
        return -1;
    }

    // 创建2个分线程 (线程创建后，会自动执行线程函数)
    pthread_t pt1, pt2; // 线程标识
    pthread_create(&pt1, NULL, first_thread_fun, NULL);
    pthread_create(&pt2, NULL, second_thread_fun, NULL);
    // 主线程需要去等待分线程执行完毕
    pthread_join(pt1, NULL);
    pthread_join(pt2, NULL);
    
    printf("main线程执行完毕 \n");

    // 关闭消息队列
    mq_close(mqd);
    // 删除消息队列
    // mq_unlink(mq_name);

    return 0;
}
